const gulp = require('gulp');
const concat = require('gulp-concat');        // 合并文件
const uglify = require('gulp-uglify');        // js 压缩
const csso = require('gulp-csso');            // css压缩
const less = require('gulp-less');	        // less编译
const autoprefixer = require('gulp-autoprefixer');	// 自动添加CSS前缀
const imagemin = require('gulp-imagemin');    // 图片压缩
const cache = require('gulp-cache');
const clean = require('gulp-clean');          // 清空文件夹
const browserSync = require('browser-sync').create();//启本地服务并开启浏览器
const watch = require('gulp-watch');//文件监听
const fs = require('fs');// 创建文件
const gulpif = require('gulp-if');            // 条件判断
const pump = require('pump');
const rev = require('gulp-rev-dxb');	// 生成版本号清单
const revCollector = require('gulp-rev-collector-dxb');   // 替换成版本号文件
const htmlmin = require('gulp-htmlmin');      // html压缩
const babel = require('gulp-babel');
const rename = require('gulp-rename');        // 重命名

// 设置环境变量
let env = '';
function set_env(type) {
     env = process.env.NODE_ENV = type || 'dev';
     //console.log(env);
}
const htmltpl = require('gulp-html-tpl');     // 引用html模板
const artTemplate = require('art-template');  // 模板渲染

gulp.task('html', function() {
    return gulp.src('./src/*.html')
        .pipe(htmltpl({
            tag: 'template',
            paths: ['./src/common'],
            engine: function(template, data) {
                return template && artTemplate.compile(template)(data);
            },
            data: {      //初始化数据
                header: true,
                g2: false
            }
        }))
        .pipe(gulpif(env==='build', gulp.dest('./build'),gulp.dest('./dist')))
        //.pipe(browserSync.stream());
});

// 打包html
/*gulp.task('html', function(){
    return gulp.src('./src/!*.html')
        .pipe(gulpif(env==='build', gulp.dest('./build'),gulp.dest('./dist')))
        .pipe(browserSync.stream());
        //.pipe(browserSync.reload({stream:true});//二选一
});*/

gulp.task('uglify_check', function (cb) {
    pump([
        gulp.src('./src/js/*.js'),
        babel(),
        uglify(),
    ], cb);
});

// 打包js
gulp.task('js_libs', function(){
    return gulp.src('./src/libs/**/*.js')
        .pipe(rename({
            dirname: '' // 清空路径
        }))
        .pipe(gulpif(env==='build', gulp.dest('./build/js'),gulp.dest('./dist/js')))
        //.pipe(browserSync.stream());
});
gulp.task('js_main', gulp.series('uglify_check',function(){
    return gulp.src('./src/js/*.js')
        .pipe(concat('main.min.js'))    // 合并文件并命名
        .pipe(babel())	// 编译es6语法
        .pipe(gulpif(env==='build', uglify()))  // 判断是否压缩压缩js
        .pipe(gulpif(env==='build', gulp.dest('./build/js'),gulp.dest('./dist/js')))
        //.pipe(browserSync.stream());
}));

// 打包css
/*gulp.task('css_main', function(){
    return gulp.src('./src/css/!**!/!*.css')
    .pipe(concat('main.min.css'))
    .pipe(gulpif(env==='build', csso()))    // 判断是否压缩压缩css
    .pipe(gulpif(env==='build', gulp.dest('./build/css'),gulp.dest('./dist/css')))
    .pipe(browserSync.stream());
});*/
gulp.task('css_main', function(){
    return gulp.src('./src/css/**/*.css')
        .pipe(less())	// 编译less
        .pipe(autoprefixer({
            overrideBrowserslist: ['last 20 versions'],
            cascade: false	// 是否美化
        }))
        .pipe(concat('main.min.css'))
        .pipe(gulpif(env==='build', csso()))    // 判断是否压缩压缩css
        .pipe(gulpif(env==='build', gulp.dest('./build/css'),gulp.dest('./dist/css')));
});


// 打包其他资源
/*gulp.task('images', function () {
    return gulp.src('./src/images/!*.*')
        .pipe(gulpif(env==='build', imagemin({  // 判断是否压缩压缩images
            progressive: true,
        })))
        .pipe(gulpif(env==='build', gulp.dest('./build/images'),gulp.dest('./dist/images')))
        .pipe(browserSync.stream());
});*/
gulp.task('images', function () {
    return gulp.src('./src/images/**')
        .pipe(gulpif(env==='build', cache(imagemin({
            optimizationLevel: 5, // 取值范围：0-7（优化等级），默认：3
            progressive: true, 	// 无损压缩jpg图片，默认：false
            interlaced: true, 	// 隔行扫描gif进行渲染，默认：false
            multipass: true 		// 多次优化svg直到完全优化，默认：false
        }))))
        .pipe(gulpif(env==='build', gulp.dest('./build/images'),gulp.dest('./dist/images')))
        //.pipe(browserSync.stream());
});
// 清空dist文件夹
gulp.task('clean', function(){
    return gulp.src(gulpif(env==='build',['./build/*'],['./dist/*']))
        .pipe(clean());
});

// 生成版本号清单
gulp.task('rev', function() {
    return gulp.src(gulpif(env==='build',['./build/js/**', './build/css/**'],['./dist/js/**', './dist/css/**']))
        .pipe(rev())
        .pipe(rev.manifest())
        .pipe(gulp.dest("./"));
});

// 添加版本号（路径替换）
gulp.task('add_version', function() {
    return gulp.src(gulpif(env==='build',['./rev-manifest.json', './build/*.html'],['./rev-manifest.json', './dist/*.html']))
        .pipe(revCollector())   // 根据.json文件 执行文件内js/css名的替换
        .pipe(gulpif(env==='build', htmlmin({
            removeComments: true,       // 清除HTML注释
            collapseWhitespace: true,   // 压缩HTML
            minifyJS: true,             // 压缩页面JS
            minifyCSS: true             // 压缩页面CSS
        })))
        .pipe(gulpif(env==='build', gulp.dest('./build'),gulp.dest('./dist')));
});

//启本地服务并开启浏览器
gulp.task('browser', function(){
    browserSync.init({
        server: gulpif(env==='build','./build','./dist')    // 访问目录
        // proxy: "你的域名或IP"    // 设置代理
    });
});

//文件监听
gulp.task('watch', function () {
    w('./src/*.html', 'html');
    w('./src/js/**', 'js_main');
    w('./src/libs/**/*.js', 'js_libs');
    w('./src/css/**', 'css_main');
    w('./src/libs/**/*.css', 'css_main');
    w('./src/images/**', 'images');

    function w(path, task){
        watch(path, gulp.series(task,function(){
            browserSync.reload();
        }));
    }
});

//初始化任务
const build = gulp.series('clean',gulp.parallel('html', 'js_libs', 'js_main','css_main','images'),'rev','add_version');
const dev = gulp.series(build,gulp.parallel('browser','watch'));
// 默认任务
gulp.task('default',dev);
// 开发环境
gulp.task('dev',done=>{
    set_env('dev');
    dev();
    done();
});
// 生产环境
gulp.task('build', done=>{
    set_env('build');
    build();
    done();
});